#include "videoread.h"

videoRead::videoRead(QObject *parent) : QObject(parent),
    m_tuer(":/images/tuer.png"),m_hat(":/images/hat.png")
{
    m_timer = new QTimer;
//    connect(m_timer,SIGNAL(timeout()),
//            this,SLOT(slot_getVideoFrame()));
    m_pVideoWorker = QSharedPointer<videoWorker> (new videoWorker);
    m_pVideoWorker.data()->slot_setInfo(this);
    connect(m_timer,SIGNAL(timeout()),
            m_pVideoWorker.data(),SLOT(slot_doWork()));

    //需要xml加到exe同级目录中
    MyFaceDetect::FaceDetectInit();

    //加载滤镜的图片
    m_moji = 0;
    //m_tuer.load("":/images/tuer.png");
}

videoRead::~videoRead()
{
    if(m_timer != nullptr)
    {
        m_timer->stop();
        delete m_timer;
        m_timer = nullptr;
    }
}

void videoRead::slot_openVideo()
{
    m_timer->start(1000 / FRAME_RATE - 10);
    //打开摄像头
    cap.open(0);//打开默认摄像头
    if(!cap.isOpened())
    {
        QMessageBox::information(NULL,tr("提示"),tr("视频没有打开"));
        return;
    }

}

void videoRead::slot_closeVideo()
{
    m_timer->stop();
    //关闭摄像头
    m_timer->stop();
    if(cap.isOpened())
    {
        cap.release();
    }
}

//摄像头采集图像流程
void videoRead::slot_getVideoFrame()
{
    //从摄像头对象读取数据
    Mat frame;//mat中存放的对象 用于存储图像
    if( !cap.read(frame) )
    {
        return;
    }
    //mat图像不是显示和传输的格式（rgb）
    //需要做格式转换 opencv采集的格式是bgr，显示格式应该是rgb
    //将 opencv 采集的 BGR 的图片类型转化为 RGB24 的类型
    cvtColor(frame,frame,CV_BGR2RGB);
    //定义 QImage 对象, 用于发送数据以及图片显示
    QImage image ((unsigned const char*)frame.data,frame.cols,frame.rows,
                  QImage::Format_RGB888);

    //镜像翻转
    image = image.mirrored(true,false);

    //加滤镜，加人脸识别，加萌拍   OpenCV图像处理 todo
    //获取摄像头图片后，识别人脸的位置，返回位置对应的矩形框
    //人脸识别，如果失败，使用上一次的人脸矩形位置
    std::vector<Rect> faces;
    //存储上一次识别人脸的矩形m_vecLastFace;
    if( m_moji != 0 )
        MyFaceDetect::detectAndDisplay( frame , faces );
    //加载图片
    QImage* tmpImg = nullptr;
    switch( m_moji )
    {
    case moji_tuer:
        tmpImg = &m_tuer; break;
    case moji_hat:
        tmpImg = &m_hat; break;
    }
    if( faces .size() > 0)
    {
        m_vecLastFace = faces;
    }
    //将道具绘制到图片上
    if( tmpImg )
        if( m_moji == moji_tuer || m_moji == moji_hat )
        {
            //QPainter 使用
            QPainter paint( &image );
            //遍历所有人脸的矩形, 画道具
            for( int i = 0 ; i < m_vecLastFace.size(); ++i)
            {
                Rect rct = m_vecLastFace[i];
                int x = rct.x + rct.width*0.5 - tmpImg -> width()*0.5 + 20;//20 是图片的尺寸偏移
                int y = rct.y - tmpImg -> height();
                QPoint p (x , y);
                paint.drawImage( p , * tmpImg );
            }
        }

    //转化为大小更小的图片
    image = image.scaled( IMAGE_WIDTH,IMAGE_HEIGHT, Qt::KeepAspectRatio );
    //发送图片
    Q_EMIT SIG_sendVideoFrame( image );
}

void videoRead::slot_setMoji(int newMoji)
{
    m_moji = newMoji;
}
